{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch [1/50], Loss: 2.6193\n",
      "Epoch [2/50], Loss: 2.4733\n",
      "Epoch [3/50], Loss: 2.3664\n",
      "Epoch [4/50], Loss: 2.2652\n",
      "Epoch [5/50], Loss: 2.1533\n",
      "Epoch [6/50], Loss: 2.0819\n",
      "Epoch [7/50], Loss: 2.0071\n",
      "Epoch [8/50], Loss: 1.9504\n",
      "Epoch [9/50], Loss: 1.9152\n",
      "Epoch [10/50], Loss: 1.8682\n",
      "Epoch [11/50], Loss: 1.8123\n",
      "Epoch [12/50], Loss: 1.7825\n",
      "Epoch [13/50], Loss: 1.7479\n",
      "Epoch [14/50], Loss: 1.7010\n",
      "Epoch [15/50], Loss: 1.6756\n",
      "Epoch [16/50], Loss: 1.6415\n",
      "Epoch [17/50], Loss: 1.6221\n",
      "Epoch [18/50], Loss: 1.5788\n",
      "Epoch [19/50], Loss: 1.5584\n",
      "Epoch [20/50], Loss: 1.5262\n",
      "Epoch [21/50], Loss: 1.4867\n",
      "Epoch [22/50], Loss: 1.4340\n",
      "Epoch [23/50], Loss: 1.4114\n",
      "Epoch [24/50], Loss: 1.3894\n",
      "Epoch [25/50], Loss: 1.3683\n",
      "Epoch [26/50], Loss: 1.3468\n",
      "Epoch [27/50], Loss: 1.3117\n",
      "Epoch [28/50], Loss: 1.2776\n",
      "Epoch [29/50], Loss: 1.2604\n",
      "Epoch [30/50], Loss: 1.2323\n",
      "Epoch [31/50], Loss: 1.2221\n",
      "Epoch [32/50], Loss: 1.1684\n",
      "Epoch [33/50], Loss: 1.1696\n",
      "Epoch [34/50], Loss: 1.1147\n",
      "Epoch [35/50], Loss: 1.0728\n",
      "Epoch [36/50], Loss: 1.0762\n",
      "Epoch [37/50], Loss: 0.9971\n",
      "Epoch [38/50], Loss: 0.9989\n",
      "Epoch [39/50], Loss: 0.9648\n",
      "Epoch [40/50], Loss: 0.9776\n",
      "Epoch [41/50], Loss: 0.9209\n",
      "Epoch [42/50], Loss: 0.8921\n",
      "Epoch [43/50], Loss: 0.8976\n",
      "Epoch [44/50], Loss: 0.8674\n",
      "Epoch [45/50], Loss: 0.8532\n",
      "Epoch [46/50], Loss: 0.8029\n",
      "Epoch [47/50], Loss: 0.7983\n",
      "Epoch [48/50], Loss: 0.7593\n",
      "Epoch [49/50], Loss: 0.7227\n",
      "Epoch [50/50], Loss: 0.6991\n",
      "Accuracy of the model on the test set: 26.47%\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cohen's Kappa with quadratic weights: 0.5540\n",
      "Mean Absolute Error: 2.5392\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, cohen_kappa_score, mean_absolute_error\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "# Загрузка данных\n",
    "data = pd.read_csv(r'D:\\Proga\\AML\\PPG_dataset\\dataset_limited.csv') \n",
    "\n",
    "# Удаление пропущенных значений\n",
    "data.dropna(inplace=True)\n",
    "\n",
    "if np.any(np.isinf(data.values)):\n",
    "    data = data[np.isfinite(data).all(axis=1)]\n",
    "    \n",
    "# Выделение признаков и целевой переменной\n",
    "X = data.drop(['id', 'age_group'], axis=1).values\n",
    "y = data['age_group'].values - 1 \n",
    "\n",
    "# Нормализация данных\n",
    "scaler = StandardScaler()\n",
    "X_scaled = scaler.fit_transform(X)\n",
    "\n",
    "# Разделение данных на обучающую и тестовую выборки\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Преобразование данных в тензоры\n",
    "X_train_tensor = torch.tensor(X_train, dtype=torch.float32)\n",
    "y_train_tensor = torch.tensor(y_train, dtype=torch.long)\n",
    "X_test_tensor = torch.tensor(X_test, dtype=torch.float32)\n",
    "y_test_tensor = torch.tensor(y_test, dtype=torch.long)\n",
    "\n",
    "# Создание DataLoader\n",
    "train_dataset = TensorDataset(X_train_tensor, y_train_tensor)\n",
    "test_dataset = TensorDataset(X_test_tensor, y_test_tensor)\n",
    "\n",
    "train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)\n",
    "test_loader = DataLoader(test_dataset, batch_size=8, shuffle=False)\n",
    "\n",
    "# Определение модели 1D CNN\n",
    "class Simple1DCNN(nn.Module):\n",
    "    def __init__(self, input_dim, num_classes):\n",
    "        super(Simple1DCNN, self).__init__()\n",
    "        self.conv1 = nn.Conv1d(in_channels=1, out_channels=4, kernel_size=2, stride=1, padding=1)\n",
    "        self.conv2 = nn.Conv1d(in_channels=4, out_channels=8, kernel_size=2, stride=1, padding=1)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.pool = nn.MaxPool1d(kernel_size=2)\n",
    "        self.fc1 = nn.Linear(8 * 9, 128)\n",
    "        self.fc2 = nn.Linear(128, num_classes)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        x = x.unsqueeze(1)  # Добавляем канал\n",
    "        x = self.conv1(x)\n",
    "        x = self.conv2(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.pool(x)\n",
    "        x = x.view(x.size(0), -1)  # Flatten\n",
    "        x = self.fc1(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.fc2(x)\n",
    "        return x\n",
    "\n",
    "# Инициализация модели, функции потерь и оптимизатора\n",
    "input_dim = X.shape[1]\n",
    "num_classes = len(np.unique(y))\n",
    "model = Simple1DCNN(input_dim, num_classes)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# Обучение модели\n",
    "num_epochs = 50\n",
    "\n",
    "for epoch in range(num_epochs):\n",
    "    model.train()\n",
    "    running_loss = 0.0\n",
    "    for inputs, labels in train_loader:\n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(inputs)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        running_loss += loss.item()\n",
    "    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')\n",
    "\n",
    "# Оценка модели и сбор предсказаний\n",
    "model.eval()\n",
    "correct = 0\n",
    "total = 0\n",
    "predictions = []\n",
    "true_labels = []\n",
    "\n",
    "with torch.no_grad():\n",
    "    for inputs, labels in test_loader:\n",
    "        outputs = model(inputs)\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        predictions.extend(predicted.numpy())\n",
    "        true_labels.extend(labels.numpy())\n",
    "        total += labels.size(0)\n",
    "        correct += (predicted == labels).sum().item()\n",
    "\n",
    "print(f'Accuracy of the model on the test set: {100 * correct / total:.2f}%')\n",
    "\n",
    "# Построение матрицы ошибок\n",
    "cm = confusion_matrix(true_labels, predictions)\n",
    "\n",
    "# Визуализация матрицы ошибок\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=np.arange(num_classes), yticklabels=np.arange(num_classes))\n",
    "plt.xlabel('Predicted')\n",
    "plt.ylabel('True')\n",
    "plt.title('Confusion Matrix')\n",
    "plt.show()\n",
    "\n",
    "# Вычисление Cohen's Kappa с весами \"quadratic\"\n",
    "kappa_quadratic = cohen_kappa_score(true_labels, predictions, weights=\"quadratic\")\n",
    "print(f'Cohen\\'s Kappa with quadratic weights: {kappa_quadratic:.4f}')\n",
    "\n",
    "# Вычисление MAE\n",
    "mae = mean_absolute_error(true_labels, predictions)\n",
    "print(f'Mean Absolute Error: {mae:.4f}')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
